# 赋值
# list1 = [1, 2, 3]
# list2 = list1
# print("list1:", list1)
# print("list2:", list2)
# list1.append(4)
# print("list1:", list1)
# print("list2:", list2)
# # 查看内存地址
# print("list1:", id(list1))
# print("list2:", id(list2))      #内存地址相同
# 赋值等于完全共享资源，会随着原对象一起变化

# 浅拷贝 （数据半共享）
# 会创建新的对象，嵌套层会指向原来的内存地址
# import copy
# list1 = [1,2,3,[4,5,6]]
# list2 = copy.copy(list1)
# print("list1:", list1)
# print("list2:", list2)
# print("list1:", id(list1))
# print("list2:", id(list2))      #内存地址不相同，说明不是同一个对象
# list1.append(7)
# print("list1:", list1)
# print("list2:", list2)
# list1[3].append(8)          #嵌套列表相同
# print("list1:", list1)
# print("list2:", list2)
# print("list1[3]:", id(list1[3]))    #内存地址相同，说明是同一个对象
# print("list2[3]:", id(list2[3]))
# 外层的内存地址不同，但是内层的内存地址相同
# 优点：拷贝速度快，占用空间少，拷贝效率高

# 深拷贝 （数据完全不共享）
# 外层的对象和内部的元素都拷贝了一遍
# import copy
# list1 = [1,2,3,[4,5,6]]
# list2 = copy.deepcopy(list1)
# print("list1:", list1)
# print("list2:", list2)
# print("list1:", id(list1))      #内存地址不相同，说明不是同一个对象
# print("list2:", id(list2))
# list1.append(7)
# print("list1:", list1)
# print("list2:", list2)
# list1[3].append(8)              #嵌套列表不相同
# print("list1:", list1)
# print("list2:", list2)
# print("list1[3]:", id(list1[3]))    #内存地址不相同，说明不是同一个对象
# print("list2[3]:", id(list2[3]))

# 可变类型      list\dict\set
# 变量对应的值可以修改，但是内存地址的值不会发生改变
# list1 = [1, 2, 3]
# print("list1内存地址：", id(list1))
# list1.append(4)
# print("list1内存地址：", id(list1))

# 不可变类型   数值类型\字符串\元组
# 变量对应的值不能被修改，如果修改就会生成一个新的值，从而分配新的内存空间
# n = 10
# print ("n的内存地址：", id(n))
# n = 15
# print ("n的内存地址：", id(n))
# str1 = "hello"
# print ("str1的内存地址：", id(str1))
# str1 = "world"
# print ("str1的内存地址：", id(str1))
